#include <stdio.h>

/**
 * https://www.bilibili.com/video/BV1vs411n7TH?p=2
1. 9种控制语句, 12个关键字
   if()~ else~
   for()~
   while()~
   do~ while()
   continue    //结束本次循环, 开始下次循环
   switch case default
   break
   return
   goto        //无条件跳转,可在 "2个函数/2个循环" 中跳转(尽量少用)

 */

void switchTest();

void doWhile();

void whileTest();

void forTest();

int gotoTest1();

void gotoTest2();

void gotoTest3();

int main(void) {
    //switch 示例
    switchTest();
    //do-while 示例
    doWhile();
    //while
    whileTest();
    //for
    forTest();
    //goto
    gotoTest1();
    gotoTest2();
    gotoTest3();
    return 0;
}

/**
 * 1.switch 示例
 */
void switchTest() {
    int score;
    printf("请输入分数score:\n");
    scanf("%d", &score);
    switch (score > 10) { //1.可以这么写!!!
        case 0: {       //可加{}, 表示int a 只在这个case 语句里使用.(否则a的作用域是switch, 编译不通过)
            int a = 1;
            printf("score < 10\n");
        }
        break;
        case 1:         //输入 > 10 时
            printf("score > 10\n");
            break;
        default:
            break;
    }
}

/**
 * 2.do-while 示例
 */
void doWhile() {
    char i = 0;
    do {
        printf("i = %d\n", i++);   //2.当 i 溢出后, 再往上+, 会加到0, 然后结束!!!
    } while (i);
}

/**
 * 3.while 示例
 */
void whileTest() {
    int i = 0;
    while (i) {                //3.不会执行, 因为 i = 0
        printf("i = %d\n", i++);
    }
}

/**
 * 4.for 示例
 */
void forTest() {
    int i;
    for (i = 0; i < 10; i++) {                          //4.C89 库, a 不可直接定义在 for 里面
    }
    for (int j = 0; j < 10; j++) {                      //  C99 库, int a 可直接定义在 for 里面
    }
    for (int a = 0, b = 1; a < 10, b < 11; a++, b += 2) {//多条件
        printf("a = %d, b = %d\n", a, b);
    }
    int c = 0;
    for (;;) {                                           //  可空条件
        if (c < 10) {
            printf("c = %d\n", c++);
        } else {
            break;
        }
    }
}

/**
 * https://www.bilibili.com/video/BV1vs411n7TH?p=40
 * 5.goto 示例. 无条件跳转,可在 "2个函数/2个循环" 中跳转
 */
int gotoTest1() {
    printf("hello world1\n");
    goto FLAG;                  //跳到标志位
    printf("hello world2\n");
    return 1;
    FLAG:                       //标志位, 可写在 return 后面
    printf("hello world3\n");
    return 0;
}

//goto 循环测试
void gotoTest2() {
    int j = 0;           //要在"goto FLAG"前定义 j, 否则直接跳到了 FLAG 时 j 还未定义
    for (int i = 0; i < 10; i++) {
        if (i == 5) {
            goto FLAG;
        }
        printf("i = %d\n", i);
    }
    for (; j < 10; j++) { //上方已经定义了 j, so这儿不用定义
        FLAG:
        printf("j = %d\n", j);
    }
}

//goto 死循环
void gotoTest3() {
    FLAG:
    printf("Hello World!\n");
//    goto FLAG;               //死循环!!!
}
